﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Collections;

namespace distrilan
{
  /// <summary>
  /// Gestisce la parte di caricamento degli utenti
  /// </summary>
  public class AdminCsvSconti
  {
    /// <summary>
    /// Funzione principale caricamento degli sconti
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    static public String CaricamentoSconti(String fileName)
    {      
      String output = "";
      ArrayList arrText = AdminUtility.LeggiFile(fileName, out output);
      if (arrText.Count > 0)
      {
        ListaSconti(arrText, ref output);
        output += "Caricamento Avvenuto con successo!";
      }

      return output;
    }

    static private void ListaSconti(ArrayList lista, ref String output)
    {
      int count = 0;
      int riga = 0;
      String query = "";
      // Apro la connessione al DB
      SqlConnection connection = new SqlConnection(Utility.GetDBConnectionString());
      SqlTransaction tr = null;
      SqlCommand cmd = null;
      try
      {
        // Elimino il primo elemento che rappresenta le prime colonne
        lista.RemoveAt(0);        

        // Do inzio alla transazione
        connection.Open();
        tr = connection.BeginTransaction();
        // Elimino tutti i filtri precedentemente caricati
        query = "DELETE FROM sconti";
        cmd = new SqlCommand(query, connection);
        cmd.Transaction = tr;
        cmd.ExecuteNonQuery();

        foreach (String str in lista)
        {
          // Incremento il numero di riga
          riga++;
          // Spezzo il listato in campi
          String[] campi = str.Split(new char[] { ';' });
          // Verifico che i campi siano 5
          if (campi.Length != 5)
          {
            Utility.WriteLog("ERRORE", "ListaSconti 1", "Riga " + riga + ":la struttura della riga è errata", SiteUser.getUser().Username, str);
            output += "Si è verificato un errore durante l'elaborazione della riga " + riga + ": struttura della riga errata\n";
            continue;
          }         

          // Tolgo spazi e apici
          for (int i = 0; i < campi.Length; i++)
            campi[i] = campi[i].Replace("'", "''").Trim();

          if (campi[1] == "" )
          {
            Utility.WriteLog("ERRORE", "ListaSconti 2", "Riga " + riga + ":Specificare un utente valido", SiteUser.getUser().Username, str);
            output += "Si è verificato un errore durante l'elaborazione della riga " + riga + "(user vuoto)\n";
            continue;
          }
          // Se non viene specificata la categoria segnalo l'errore
          if (campi[0] == "")
          {
            Utility.WriteLog("ERRORE", "ListaSconti 3", "Riga " + riga + ":Specificare una categoria valida", SiteUser.getUser().Username, str);
            output += "Si è verificato un errore durante l'elaborazione della riga " + riga + "(categoria vuota)\n";
            continue;
          }
          // Impedisco che vengano messi gli sconti 2 e 3 se non c'è l'uno o il 3 se non c'è il 2
          if (campi[2] == "") { campi[3] = "";}
          if (campi[3] == "") { campi[4] = "";}          

          // Controllo che gli sconti siano validi
          
          String sconto1 = "0.0";
          String sconto2 = "0.0";
          String sconto3 = "0.0";
          if (campi[2] != "")
          {
            try
            {
              sconto1 = Utility.GetDoubleForDB(Convert.ToDouble(campi[2]));
            }
            catch (Exception)
            {
              Utility.WriteLog("ERRORE", "ListaSconti 4", "La riga " + riga + " ha lo sconto 1 scritto in modo errato", SiteUser.getUser().Username, "");
              output += "WARNING: La riga " + riga + " ha lo sconto scritto in modo errato\n";
            }
            if (campi[3] != "")
            {
              try
              {
                sconto2 = Utility.GetDoubleForDB(Convert.ToDouble(campi[3]));
              }
              catch (Exception)
              {
                Utility.WriteLog("ERRORE", "ListaSconti 5", "La riga " + riga + " ha lo sconto 2 scritto in modo errato", SiteUser.getUser().Username, "");
                output += "WARNING: La riga " + riga + " ha lo sconto 2 scritto in modo errato\n";
              }
              if (campi[4] != "")
              {
                try
                {
                  sconto3 = Utility.GetDoubleForDB(Convert.ToDouble(campi[4]));
                }
                catch (Exception)
                {
                  Utility.WriteLog("ERRORE", "ListaSconti 6", "La riga " + riga + " ha lo sconto 3 scritto in modo errato", SiteUser.getUser().Username, "");
                  output += "WARNING: La riga " + riga + " ha lo sconto 3 scritto in modo errato\n";
                }
              }
            }
          }
          // Ora scrivo l'articolo riga nel database
          query = "INSERT INTO sconti(username,categoria,sconto1,sconto2,sconto3) VALUES (";
          query += "'" + campi[1] + "','" + campi[0] + "'," + sconto1 + "," + sconto2 + "," + sconto3 + ")";

          cmd = new SqlCommand(query, connection);
          cmd.Transaction = tr;
          try
          {
            cmd.ExecuteNonQuery();
          }
          catch (SqlException sqlex)
          {
            if (sqlex.Message.Contains("Violation of PRIMARY KEY constraint"))
            {
              Utility.WriteLog("ERRORE", "ListaSconti 7", "Riga " + riga + ":Codice sconto duplicato", SiteUser.getUser().Username, str);
              output += "Si è verificato un errore durante l'elaborazione della riga " + riga + " del file sconti: Codice sconto duplicato\n";
              continue;
            }
            //throw sqlex;
            throw new Exception("Si è verificato un errore durante l'elaborazione della riga " + riga + " del file sconti: Codice sconto duplicato\n");
          }         
          count++;
        }
        if (count > 0)
        {
          output += "Caricati " + count + " Sconti\n";
          tr.Commit();
        }
        else
        {
          output += "Non è stata individuata alcuna riga valida nel file";          
          throw new Exception("Nessuna Riga Valida nel file!");
        }                
      }
      catch (Exception ex)
      {
        if (tr != null) tr.Rollback();
        Utility.WriteLog("ERRORE", "ListaSconti 8 alla riga:" + riga, ex.Message, SiteUser.getUser().Username, "");
        output += "Si è verificato un errore irreversibile durante l'elaborazione della riga " + riga + "\n";
        throw ex;
      }
      finally
      {
        connection.Close();
      }
    }

  }
}
